import patchVnode from './patchVnode';
import createElement from './createElement';

// 是否是同一个虚拟节点
function checkSameVnode(a, b) {
  return a.sel == b.sel && a.key == b.key;
}

export default function updateChildren(parentElm, oldCh, newCh) {
  console.log('我是updateChildren');
  // 旧前
  let oldStartIdx = 0;
  // 新前
  let newStartIdx = 0;
  // 旧后
  let oldEndIdx = oldCh.length - 1;
  // 新后
  let newEndIdx = newCh.length - 1;

  // 旧前节点
  let oldStartVnode = oldCh[0];
  // 旧后节点
  let oldEndVnode = oldCh[oldEndIdx];
  // 新前节点
  let newStartVnode = newCh[0];
  // 新后节点
  let newEndVnode = newCh[newEndIdx];

  // 开始循环
  while (oldStartIdx <= oldEndIdx && newStartIdx <= oldEndIdx) {
    // 新前与旧前
    if (checkSameVnode(oldStartVnode, newStartVnode)) {
      patchVnode(oldStartVnode, newStartVnode);
      oldStartVnode = oldCh[++oldStartIdx];
      newStartVnode = newCh[++newStartIdx];
    } else if (checkSameVnode(oldEndVnode, newStartVnode)) {
      // 新后与旧后
      patchVnode(oldEndVnode, newEndVnode);
      oldEndVnode = oldCh[--oldEndIdx];
      newEndVnode = newCh[--newEndIdx];
    } else if (checkSameVnode(newEndVnode, oldStartVnode)) {
      // 新后与旧前
      patchVnode(oldStartVnode, newEndVnode);
      // 需要移动节点(结尾插入)
      parentElm.insertBefore(oldStartVnode.elm, oldEndVnode.elm.nextSibling);
      // 移动指针
      newEndVnode = newCh[--newEndIdx];
      oldStartVnode = oldCh[++oldStartIdx];
    } else if (checkSameVnode(newStartVnode, oldEndVnode)) {
      // 新前与旧后
      patchVnode(oldEndVnode, newStartVnode);
      // 需要移动节点（开头插入）
      parentElm.insertBefore(oldEndVnode.elm, oldStartVnode.elm);
      // 移动指针
      oldEndVnode = oldCh[--oldEndIdx];
      newStartVnode = newCh[++newStartIdx];
    } else {
      // 4种情况都没命中的情况

    }
  }

  // 新增和删除
  // 继续看看有没有剩的
  if (newStartIdx <= newEndIdx) {
    console.log('new还有剩余节点没有处理！');
    const before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;
    for (let i = newStartIdx; i < newEndIdx; i++) {
      parentElm.insertBefore(createElement(newCh[i]), before);
    }
  } else if (oldStartIdx <= oldEndIdx) {
    console.log('old还有剩余节点没有处理！');
    for (let i = oldStartIdx; i < oldEndIdx; i++) {
      parentElm.removeChild(oldCh[i].elm);
    }
  }
}